#pragma once
#include <iostream>
#include <string>
#include <mysql/mysql.h>
#include "../comm/httplib.h"
#include <jsoncpp/json/json.h>

#include "register_send.hpp"

#include "head_mysql.hpp"
#include <regex>
#include "timestamp.hpp"
#include "../comm/log.hpp"
using namespace std;
using namespace httplib;
using namespace ns_log;
// 验证用户名、密码和邮件的函数
std::string validateRegistration_fp(const std::string &password, const std::string &email)
{
    // 密码正则表达式：长度8到20，只能包含英文、数字和特殊符号，不能包含汉字
    std::regex passwordRegex("^[\\w\\W]{8,20}$"); // 允许所有字符
    std::regex noChineseRegex("[\\x00-\\x7F]*");  // 确保密码不包含汉字
    // 邮件正则表达式：简单的有效邮件格式
    std::regex emailRegex("^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,}$");

    if (!std::regex_match(password, passwordRegex) || !std::regex_match(password, noChineseRegex))
    {
        return "密码无效。它必须有8-20个字符长，并且不能包含汉字";
    }

    if (!std::regex_match(email, emailRegex))
    {
        return "无效的电子邮件格式";
    }

    return "注册详细信息有效";
}

// 生成32位随机验证令牌
std::string generate_verification_token_fp()
{
    std::string chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
    std::random_device rd;
    std::mt19937 generator(rd());
    std::uniform_int_distribution<> distribution(0, chars.size() - 1);

    std::string token;
    for (int i = 0; i < 32; ++i)
    {
        token += chars[distribution(generator)];
    }
    return token;
}
void handle_register_test_fp(const Request &req, Response &res)
{
    // 从请求中解析出用户名、密码和邮箱
    Json::Reader reader;
    Json::Value json_req;
    reader.parse(req.body, json_req);
    std::string password = json_req["password"].asString();
    std::string email = json_req["email"].asString();
    std::string username = json_req["username"].asString();

    // 验证用户名、密码和邮箱
    string validation_message = validateRegistration_fp(password, email);
    if (validation_message != "注册详细信息有效")
    {
        LOG(ERROR) << validation_message << endl;
        res.set_content(validation_message, "text/plain");
        res.status = 400;
        return;
    }

    // 连接到数据库
    MYSQL *conn = connect_db();
    if (conn == nullptr)
    {
        res.set_content("数据库连接失败", "text/plain");
        res.status = 500;
        return;
    }

    // 判断用户重置密码时是否是原邮箱
    //   构建插入用户数据的SQL查询
    MYSQL_RES *res_;
    MYSQL_ROW row;
    std::string query_ = "SELECT count(*) FROM users WHERE username= '" + username + "'and email= '" + email + "'";
    LOG(DEBUG) << "query: " << query_ << endl;
    // 执行查询查操作
    if (mysql_query(conn, query_.c_str()))
    {
        LOG(ERROR) << "mysql_query() failed: " << mysql_error(conn) << "\n";
        res.set_content("重置失败", "text/plain");
        res.status = 500;
        mysql_close(conn);
    }
    else
    {
        res_ = mysql_store_result(conn);
        row = mysql_fetch_row(res_);
        if (res_ == NULL || row[0] == NULL || atoi(row[0]) == 0)
        {
            res.set_content("请输入注册该账号的邮箱", "text/plain");
            res.status = 500;
            mysql_close(conn);
            return;
        }
    }

    // 生成验证令牌
    std::string verification_token = generate_verification_token_fp();
    LOG(DEBUG) << "verification_token: " << verification_token << endl;
    // 构建插入用户数据的SQL查询
    std::string query = "update users set verification_token='" + verification_token + "' where username='" + username + "'";
    LOG(DEBUG) << "query: " << query << endl;
    // 执行插入操作
    if (mysql_query(conn, query.c_str()))
    {
        LOG(ERROR) << "mysql_query() failed: " << mysql_error(conn) << "\n";
        res.set_content("重置失败", "text/plain");
        res.status = 500;
    }
    else
    {
        // 发送验证邮件
        std::string verification_link = "您的验证码是: " + verification_token + "。请在5分钟内使用此验证码完成验证。不要将此验证码告诉他人。";
        bool result = send_verification_email(email, verification_link); // 发送验证邮件的函数
        if (result)
        {
            *TIME_STAMP_BEGIN_1 = time(nullptr);
            res.set_content("验证码发送成功，请检查您的电子邮件，以验证您的帐户", "text/plain");
            res.status = 200; // 设置状态码为 200 表示请求成功
        }
        else
        {
            res.set_content("无法发送验证电子邮件", "text/plain"); // 注意这段话改成中文时，会影响register.html计时器判断
            res.status = 500;                                      // 设置状态码为 500 表示服务器错误
        }
        mysql_close(conn);
    }
}